home *** CD-ROM | disk | FTP | other *** search
- /*
- DU_LIB v2
- Gem Window Management & Dialog Library For Lattice C
- ½1994,95 by Craig Graham.
- Based on the DU_LIBv1 Library for HiSoft Basic.
- */
-
- /*
- Scrolling List Support
- NOTE: Scrolling list objects MUST be cut-pasted from the library dialog.
- Major use is made of callback functions to implement the scrolling
- list widget.....
- */
-
- #include "dulib.h"
-
- /*
- Set a scrolling list initially.
- wait_event returns selection number in the global scroll_selection
- */
- short Set_scroll_list(short dialog, short ob, short e, char *text_list[], short nt, short nd)
- {
- OBJECT* l;
- OBJECT* lo;
- Elist *n;
- short f,ml,ln;
-
- n=(Elist*)0;
-
- ml=0;
- for (f=0; f<nt; f++)
- {
- ln=strlen(text_list[f]);
- if (ln>ml) ml=ln;
- }
- ml++;
-
- Set_object_callback(dialog, (short)(ob+scroll_up), &ScrollListUp);
- Set_object_callback(dialog, (short)(ob+scroll_down), &ScrollListDown);
- Set_object_callback(dialog, (short)(ob+scroll_drag), &ScrollListDrag);
- Set_object_callback(dialog, (short)(ob+scroll_text_area), &SelectFromScrollList);
- Set_object_dcallback(dialog, (short)(ob+scroll_text_area), &SelectFromScrollList);
- Set_object_redraw(dialog, (short)(ob+scroll_text_area), &DisplayScrollList);
- Set_object_event(dialog, (short)(ob+scroll_text_area), e);
- Set_object_devent(dialog, (short)(ob+scroll_text_area), e);
- Set_object_event(dialog, ob, e);
- rsrc_gaddr(0,dialog,&l);
- lo=l+ob;
- lo->ob_height=nd*16+8;
- lo->ob_width=ml*8+21;
- lo=l+(ob+scroll_text_area);
- lo->ob_height=nd*16+6;
- lo->ob_width=ml*8;
- lo=l+(ob+scroll_drag_background);
- lo->ob_height=nd*16-33;
- lo=l+(ob+scroll_down);
- lo->ob_y=nd*16-11;
-
- if (find_event(dialog,ob,&n))
- {
- n->stext.texts=text_list;
- n->stext.number=nt;
- n->stext.display=nd;
- n->stext.current=0;
- n->stext.start=0;
- return 1;
- }else{
- form_alert(1,"[1][ ERROR: unable to create scroll list. ][ OOPS ]");
- return 0;
- }
- }
-
- /*
- Change a scrolling lists contents.
- */
- short Change_scroll_list(short dialog, short ob, char *text_list[], short nt)
- {
- OBJECT *l;
- Elist *n;
-
- n=(Elist*)0;
-
- if (find_event(dialog,ob,&n))
- {
- n->stext.texts=text_list;
- n->stext.number=nt;
- n->stext.current=0;
- n->stext.start=0;
-
- rsrc_gaddr(0,dialog,&l);
- l=l+(ob+scroll_drag);
- l->ob_y=1;
-
- dialog_update(dialog);
-
- return 1;
- }else{
- form_alert(1,"[1][ ERROR: try to change scroll | text on non-event object. ][ OOPS ]");
- return 0;
- }
- }
-
- short SelectFromScrollList(void)
- {
- OBJECT *l;
- short my,y;
- short start,nd,nt,ne,s,sel,dh;
- char *(*a);
- Elist *n;
-
- n=(Elist*)0;
-
- if (find_event(this_dialog,(short)(this_ob-scroll_text_area),&n))
- {
- if (Get_object_scroll(this_dialog,(short)(this_ob-scroll_text_area),&a,&start,&nt,&nd,&junk))
- {
- dh=n->stext.display;
-
- graf_mkstate(&junk,&my,&junk,&junk);
- y=my-cr_clip.g_y-10;
-
- sel=(y*dh)/(cr_clip.g_h-8);
- if (sel<0) sel=0;
- if (sel>nd) sel=nd;
-
- ne=start+nd;
- if (ne>nt) ne=nt;
-
- rsrc_gaddr(0,this_dialog,&l);
- Get_ob_info(l,this_ob,&junk,&junk,&s);
- graf_mouse(M_OFF,NULL);
- n->stext.current=sel+start;
-
- DisplayScrollList();
-
- graf_mouse(M_ON,NULL);
- scroll_selection=sel+start;
-
- switch (click_count) // allow seperate events for single & double clicks
- {
- case 1:
- return n->this_event;
- break;
- case 2:
- return n->this_devent;
- break;
- }
-
- }else{
- form_alert(1,"[1][ ERROR: cannot select scroll text. ][ OOPS ]");
- return 0;
- }
- }else{
- form_alert(1,"[1][ ERROR: cannot select scroll text. ][ OOPS ]");
- return 0;
- }
- }
-
- short ScrollListDrag(void)
- {
- OBJECT *l;
- OBJECT *lo;
- short sl_ob;
- Elist *obj;
- char *(*t);
- short bh,start,istart,ostart,current,nt,nd,my,mb,y;
- short clip[4];
-
- sl_ob=this_ob-scroll_drag;
- if (Get_object_scroll(this_dialog,sl_ob,&t,&istart,&nt,&nd,¤t))
- {
- find_event(this_dialog,sl_ob,&obj);
-
- rsrc_gaddr(0,this_dialog,&l);
- lo=l+sl_ob+scroll_drag_background;
-
- bh=lo->ob_height;
- lo=l+this_ob;
- bh=bh-(lo->ob_height);
-
- if (nt>nd)
- {
- this_ob=sl_ob+scroll_text_area;
- #ifndef __USE_GNU
- objc_xywh(l,this_ob,&cr_clip);
- #else
- objc_offset(l,this_ob,&x,&y);
- cr_clip.g_x=x;
- cr_clip.g_y=y;
- cr_clip.g_w=(l+this_ob)->ob_width;
- cr_clip.g_h=(l+this_ob)->ob_height;
- #endif
- clip[0]=cr_clip.g_x; clip[1]=cr_clip.g_y; clip[2]=cr_clip.g_x+cr_clip.g_w-1; clip[3]=cr_clip.g_y+cr_clip.g_h-1;
- vs_clip(x_handle,1,clip);
-
- ostart=start=istart;
- graf_mkstate(&junk,&my,&mb,&junk);
- my=my*(nt-nd)/(bh-2);
- for (; mb==1; graf_mkstate(&junk,&y,&mb,&junk))
- {
- y=y*(nt-nd)/(bh-2);
- start=istart+(y-my);
- if (start<0) start=0;
- if ((start+nd)>nt) start=nt-nd;
- if (start!=ostart)
- {
- obj->stext.start=start;
- lo->ob_y=(((bh-2)*start)/(nt-nd))+1;
- graf_mouse(M_OFF,NULL);
- objc_draw(l,this_ob,2,scrn_x,scrn_y,scrn_x+scrn_w,scrn_y+scrn_h);
- objc_draw(l,(sl_ob+scroll_drag_background),2,scrn_x,scrn_y,scrn_x+scrn_w,scrn_y+scrn_h);
- DisplayScrollList();
- graf_mouse(M_ON,NULL);
- ostart=start;
- }
- }
- return TRUE;
- } else {
- return FALSE;
- }
- } else {
- return FALSE;
- }
- }
-
- short ScrollListUp(void)
- {
- OBJECT *l;
- OBJECT *lo;
- Elist *obj;
- char *(*t);
- short bh,start,ostart,current,nt,nd,mb;
- short clip[4];
-
- if (Get_object_scroll(this_dialog,(short)(this_ob-scroll_up),&t,&start,&nt,&nd,¤t))
- {
- find_event(this_dialog,(short)(this_ob-scroll_up),&obj);
-
- rsrc_gaddr(0,this_dialog,&l);
- lo=l+(this_ob-scroll_up+scroll_drag_background);
-
- bh=lo->ob_height;
- lo=l+(this_ob-scroll_up+scroll_drag);
- bh=bh-(lo->ob_height);
-
- if (nt>nd)
- {
- this_ob=this_ob-scroll_up+scroll_text_area;
- #ifndef __USE_GNU
- objc_xywh(l,this_ob,&cr_clip);
- #else
- objc_offset(l,this_ob,&x,&y);
- cr_clip.g_x=x;
- cr_clip.g_y=y;
- cr_clip.g_w=(l+this_ob)->ob_width;
- cr_clip.g_h=(l+this_ob)->ob_height;
- #endif
- clip[0]=cr_clip.g_x; clip[1]=cr_clip.g_y; clip[2]=cr_clip.g_x+cr_clip.g_w-1; clip[3]=cr_clip.g_y+cr_clip.g_h-1;
- vs_clip(x_handle,1,clip);
-
- ostart=start;
- mb=1;
- for (; (mb==1); graf_mkstate(&junk,&junk,&mb,&junk))
- {
- if (start>0)
- {
- start=start-1;
- if (start!=ostart)
- {
- obj->stext.start=start;
- lo->ob_y=(((bh-2)*start)/(nt-nd))+1;
- graf_mouse(M_OFF,NULL);
- objc_draw(l,this_ob,2,scrn_x,scrn_y,scrn_x+scrn_w,scrn_y+scrn_h);
- objc_draw(l,(short)(this_ob-scroll_text_area+scroll_drag_background),2,scrn_x,scrn_y,scrn_w,scrn_h);
- DisplayScrollList();
- graf_mouse(M_ON,NULL);
- ostart=start;
- }
- }
- }
- return 1;
- } else {
- return 0;
- }
- } else {
- return 0;
- }
- }
-
- short ScrollListDown(void)
- {
- OBJECT *l;
- OBJECT *lo;
- Elist *obj;
- char *(*t);
- short bh,start,ostart,current,nt,nd,mb;
- short clip[4];
-
- if (Get_object_scroll(this_dialog,(short)(this_ob-scroll_down),&t,&start,&nt,&nd,¤t))
- {
- find_event(this_dialog,(short)(this_ob-scroll_down),&obj);
-
- rsrc_gaddr(0,this_dialog,&l);
- lo=l+(this_ob-scroll_down+scroll_drag_background);
-
- bh=lo->ob_height;
- lo=l+(this_ob-scroll_down+scroll_drag);
- bh=bh-(lo->ob_height);
-
- if (nt>nd)
- {
- this_ob=this_ob-scroll_down+scroll_text_area;
- #ifndef __USE_GNU
- objc_xywh(l,this_ob,&cr_clip);
- #else
- objc_offset(l,this_ob,&x,&y);
- cr_clip.g_x=x;
- cr_clip.g_y=y;
- cr_clip.g_w=(l+this_ob)->ob_width;
- cr_clip.g_h=(l+this_ob)->ob_height;
- #endif
- clip[0]=cr_clip.g_x; clip[1]=cr_clip.g_y; clip[2]=cr_clip.g_x+cr_clip.g_w-1; clip[3]=cr_clip.g_y+cr_clip.g_h-1;
- vs_clip(x_handle,1,clip);
-
- ostart=start;
- mb=1;
- for (; (mb==1); graf_mkstate(&junk,&junk,&mb,&junk))
- {
- if ((start+nd)<nt)
- {
- start=start+1;
- if (start!=ostart)
- {
- obj->stext.start=start;
- lo->ob_y=1+(((bh-2)*start)/(nt-nd));
- graf_mouse(M_OFF,NULL);
- objc_draw(l,this_ob,2,scrn_x,scrn_y,scrn_x+scrn_w,scrn_y+scrn_h);
- objc_draw(l,(short)(this_ob-scroll_text_area+scroll_drag_background),2,scrn_x,scrn_y,scrn_w,scrn_h);
- DisplayScrollList();
- graf_mouse(M_ON,NULL);
- ostart=start;
- }
- }
- }
- return 1;
- } else {
- return 0;
- }
- } else {
- return 0;
- }
- }
-
- short DisplayScrollList(void)
- {
- char *(*dt);
- Elist *n;
- short tl,ne,start,nt,nd,current;
- short rect[4];
-
- n=(Elist*)0;
-
- if (find_event(this_dialog,this_ob,&n))
- {
- Get_object_scroll(this_dialog,(short)(this_ob-scroll_text_area),&dt,&start,&nt,&nd,¤t);
-
- if (nd==0) return 1;
-
- ne=start+nd;
- if (ne>nt) ne=nt;
- vst_color(x_handle,1); vst_point(x_handle,10,&junk,&junk,&junk,&junk);
- vst_rotation(x_handle,0); vst_alignment(x_handle,0,0,wm_inv,wm_outv);
- vsf_color(x_handle,0); vsf_interior(x_handle,FIS_SOLID); vsf_perimeter(x_handle,0);
- vswr_mode(x_handle,MD_TRANS);
-
- rect[0]=cr_clip.g_x; rect[2]=rect[0]+cr_clip.g_w-1;
- rect[1]=cr_clip.g_y; rect[3]=rect[1]+cr_clip.g_h-1;
- v_bar(x_handle,rect);
- vsf_color(x_handle,1);
-
- tl=cr_clip.g_y+18;
- for(ne=start; ne<start+nd; ne++)
- {
- if (ne==current)
- {
- if (ScrollSelectionIsInverse)
- {
- vst_color(x_handle,0);
- }else{
- vst_effects(x_handle,1);
- }
- rect[1]=tl-15; rect[3]=rect[1]+16;
- v_bar(x_handle,rect);
- v_gtext(x_handle,cr_clip.g_x+5,tl,dt[ne]);
- if (ScrollSelectionIsInverse)
- {
- vst_color(x_handle,1);
- }else{
- vst_effects(x_handle,0);
- }
- }else{
- v_gtext(x_handle,cr_clip.g_x+5,tl,dt[ne]);
- }
- tl=tl+16;
- }
- return 1;
- } else {
- return 0;
- }
- }
-
- short Get_object_scroll(short dialog, short ob, char *(*t[]), short *start, short *nt, short *nd, short *current)
- {
- Elist *n;
-
- n=(Elist*)0;
-
- if (find_event(dialog,ob,&n))
- {
- if (n->stext.texts)
- {
- if (n->stext.number<n->stext.display)
- {
- *start=0;
- *nd=n->stext.number;
- }else{
- *start=n->stext.start;
- *nd=n->stext.display;
- }
- *nt=n->stext.number;
- *t=n->stext.texts;
- *current=n->stext.current;
- return 1;
- } else {
- return 0;
- }
- } else {
- return 0;
- }
- }
-